home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / util / pack / xfdmaster.lha / xfd / Developer / Sources / C / ExeHead.c next >
C/C++ Source or Header  |  1999-02-05  |  4KB  |  137 lines

  1. /* Objectheader
  2.  
  3.     Name:        ExeHead.c
  4.     Version:    $VER: ExeHead.c 1.4 (07.12.1998)
  5.     Description:    Exe C header for xfd externals testing
  6.     Author:        SDI
  7.     Distribution:    PD
  8.  
  9.  1.0   22.12.97 : first version
  10.  1.1   04.06.98 : little bugfix
  11.  1.2   04.08.98 : added SysBase
  12.  1.3   31.10.98 : SysBase passed to client in pseudo-master-base
  13.  1.4   07.12.98 : added error output
  14. */
  15.  
  16. #include <proto/dos.h>
  17. #include <proto/exec.h>
  18. #include <libraries/xfdmaster.h>
  19. #include <exec/memory.h>
  20.  
  21. #ifdef __MAXON__
  22.   #define __asm
  23. #endif
  24.  
  25. #define PARAM "FROM/A,TO"
  26.  
  27. typedef BOOL __asm (*RecogFunc) (register __a0 STRPTR,
  28.      register __d0 ULONG, register __a1 struct xfdRecogResult *);
  29. typedef BOOL __asm (*DecrunchFunc) (register __a0 struct xfdBufferInfo *,
  30. register __a6 struct xfdMasterBase *);
  31.  
  32. struct DosLibrary *DOSBase = 0;
  33. struct ExecBase   *SysBase = 0;
  34. extern struct xfdSlave FirstSlave;
  35.  
  36. LONG main(void)
  37. {
  38.   STRPTR args[2];
  39.   LONG ret = RETURN_FAIL;
  40.   struct RDArgs *rda;
  41.  
  42.   SysBase = (*((struct ExecBase **) 4));
  43.  
  44.   if(!(DOSBase = (struct DosLibrary *) OpenLibrary("dos.library", 37)))
  45.     return ret;
  46.  
  47.   args[1] = 0;
  48.  
  49.   if((rda = ReadArgs(PARAM, (LONG *) &args, 0)))
  50.   {
  51.     ULONG fh;
  52.  
  53.     if((fh = Open(args[0], MODE_OLDFILE)))
  54.     {
  55.       struct FileInfoBlock *fib;
  56.  
  57.       if((fib = (struct FileInfoBlock *) AllocDosObject(DOS_FIB, 0)))
  58.       {
  59.         if((ExamineFH(fh, fib)))
  60.         {
  61.       ULONG insize;
  62.       STRPTR inbuf;
  63.  
  64.           insize = fib->fib_Size;
  65.           if((inbuf = (STRPTR) AllocMem(insize, MEMF_ANY)))
  66.           {
  67.             if(Read(fh, inbuf, insize) == insize)
  68.             {
  69.               struct xfdSlave *slave = &FirstSlave;
  70.               struct xfdRecogResult rr;
  71.               ret = 0;
  72.  
  73.           while(slave)
  74.           {
  75.         if(slave->xfds_MinBufferSize <= insize &&
  76.         ((RecogFunc)slave->xfds_RecogBuffer)(inbuf, insize, &rr))
  77.         {
  78.           /* We do use xfdBufferInfo only local, so it is ok not
  79.              to get it with xfdmaster functions. */
  80.           struct xfdBufferInfo xbi;
  81.           struct xfdMasterBase xb;
  82.  
  83.           /* We set only these fields, which are accessed by the
  84.              slaves. When test slaves access more than these fields,
  85.              we need to init these new fields as well!!! */
  86.           xbi.xfdbi_SourceBuffer = inbuf;
  87.           xbi.xfdbi_SourceBufLen = insize;
  88.           xbi.xfdbi_TargetBufMemType = MEMF_ANY;
  89.           xbi.xfdbi_Error = 0;
  90.           xb.xfdm_ExecBase = SysBase;
  91.  
  92.           Printf("Type is '%s'\n", slave->xfds_PackerName);
  93.  
  94.           if(((DecrunchFunc) slave->xfds_DecrunchBuffer)(&xbi, &xb))
  95.           {
  96.             if(args[1])
  97.             {
  98.               ULONG destfh;
  99.  
  100.                   if((destfh = Open(args[1], MODE_NEWFILE)))
  101.                   {
  102.                     if(Write(destfh, xbi.xfdbi_TargetBuffer,
  103.                     xbi.xfdbi_TargetBufSaveLen) != xbi.xfdbi_TargetBufSaveLen)
  104.                       ret = RETURN_ERROR;
  105.                     Close(destfh);
  106.                   }
  107.                   else
  108.                     ret = RETURN_ERROR;
  109.                 }
  110.                 FreeMem(xbi.xfdbi_TargetBuffer, xbi.xfdbi_TargetBufLen);
  111.           }
  112.           else
  113.           {
  114.                 ret = -xbi.xfdbi_Error;
  115.                 Printf("Error %ld\n", xbi.xfdbi_Error);
  116.               }
  117.               slave = 0;
  118.         } /* RecogFunc */
  119.         else
  120.           slave = slave->xfds_Next;
  121.           } /* while */
  122.         } /* Read */
  123.             FreeMem(inbuf, insize);
  124.           } /* AllocMem(inbuf, insize) */
  125.         } /* Examine */
  126.         FreeDosObject(DOS_FIB, fib);
  127.       } /* AllocDosObject */
  128.       Close(fh);
  129.     } /* Open */
  130.     FreeArgs(rda);
  131.   } /* ReadArgs */
  132.  
  133.   CloseLibrary((struct Library *) DOSBase);
  134.  
  135.   return ret;
  136. }
  137.